package com.fdb.efp.nls.service.impl;

import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.efp.nls.service.dao.ContTempGDao;
import com.fdb.efp.nls.service.dao.ContTempInfoDao;
import com.fdb.efp.nls.service.dao.PrdInfoDao;
import com.fdb.efp.nls.service.domain.ContTempG;
import com.fdb.efp.nls.service.domain.ContTempInfo;
import com.fdb.efp.nls.service.domain.PrdInfo;
import com.fdb.efp.nls.service.facade.ContTempGService;
import com.fdb.efp.nls.service.vo.ContTempGVO;
import com.fdb.efp.nls.service.vo.ContTempRelGVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * <p>ServiceImpl: 合同模板组信息表				<p>
 * @author fuzm
 * @date 2018-05-07
 */
@Service("contTempGService")
public class ContTempGServiceImpl implements ContTempGService, FrameworkService {
	
	private static Logger logger = LoggerFactory.getLogger(ContTempGServiceImpl.class);

	@Autowired
	private ContTempGDao contTempGDao;
	@Autowired
	private PrdInfoDao prdInfoDao;
	@Autowired
	private ContTempInfoDao contTempInfoDao;
	
	/**
	 * 新增操作
	 */
	public int insertContTempG(ContTempGVO inContTempGVo) {
		logger.debug("当前新增数据为:"+ inContTempGVo.toString());
		int num = 0;
		try {
			ContTempG contTempG = new ContTempG();
			beanCopy(inContTempGVo, contTempG);
			String contGroupId = UUID.randomUUID().toString().replace("-", "");
			contTempG.setContGroupId(contGroupId);
			num = contTempGDao.insertContTempG(contTempG);
		} catch (Exception e) {
			logger.error("新增数据发生异常!", e);
			num = -1;
		}
		logger.debug("当前新增数据条数为:"+ num);
		return num;
	}

	/**
	 * 删除操作
	 */
	public int deleteByPk(ContTempGVO inContTempGVo) {
		logger.debug("当前删除数据条件为:"+ inContTempGVo);
		int num = 0;
		try {
			ContTempG contTempG = new ContTempG();
			beanCopy(inContTempGVo, contTempG);
			ContTempG temp = contTempGDao.queryByPk(contTempG);
			if ( !"0".equals(temp.getStatus() ) ) {
				num = -2;
			}else {
				num = contTempGDao.deleteByPk(contTempG);
				if ( num > 0)
					num += contTempGDao.deletContTempRelGByGroupId(contTempG);
			}
			
		} catch (Exception e) {
			logger.error("删除数据发生异常!", e);
			num = -1;
		}
		logger.debug("根据条件:"+ inContTempGVo +"删除的数据条数为"+ num);
		return num;
	}


	/**
	 * 更新操作
	 */
	public int updateByPk(ContTempGVO inContTempGVo) {
		logger.debug("当前修改数据为:"+ inContTempGVo.toString());
		int num = 0;
		try {
			ContTempG contTempG = new ContTempG();
			beanCopy(inContTempGVo, contTempG);
			num = contTempGDao.updateByPk(contTempG);
		} catch (Exception e) {
			logger.error("修改数据发生异常!", e);
			num = -1;
		}
		logger.debug("根据条件:"+ inContTempGVo +"修改的数据条数为"+ num);
		return num;
	}
	
	/**
	 * 查询操作
	 */
	public ContTempGVO queryByPk(ContTempGVO inContTempGVo) {
		
		logger.debug("当前查询参数信息为:"+ inContTempGVo);
		try {
			ContTempG queryContTempG = new ContTempG();
			beanCopy(inContTempGVo, queryContTempG);
			ContTempG queryRslContTempG = contTempGDao.queryByPk(queryContTempG);
			if (Objects.nonNull(queryRslContTempG)) {
				ContTempGVO outContTempGVo = beanCopy(queryRslContTempG, new ContTempGVO());
				logger.debug("当前查询结果为:"+ outContTempGVo.toString());
				return outContTempGVo;
			} else {
				logger.debug("当前查询结果为空!");
			}
		} catch (Exception e) {
			logger.error("查询数据发生异常!", e);
		}
		return null;
	}


	/**
	 * 查询用户权限数据
	 */
	@SuppressWarnings("unchecked")
	public List<ContTempGVO> queryAllOwner(ContTempGVO contTempGVo) {

		logger.debug("当前查询本人所属数据信息的参数信息为:");
		List<ContTempGVO> list = null;
		try {
			List<ContTempG> contTempGs = contTempGDao.queryAllOwnerByPage(contTempGVo);
			logger.debug("当前查询本人所属数据信息的结果集数量为:"+ contTempGs.size());
			pageSet(contTempGs, contTempGVo);
			list = (List<ContTempGVO>) beansCopy(contTempGs, ContTempGVO.class);
		} catch (Exception e) {
			logger.error("数据转换出现异常!", e);
		}
		
		return list;
	
	}


	/**
	 * 查询当前机构权限数据
	 */
	@SuppressWarnings("unchecked")
	public List<ContTempGVO> queryAllCurrOrg(ContTempGVO contTempGVo) {

		logger.debug("当前查询本人所属机构数据信息的参数信息为:");
		List<ContTempG> contTempGs = contTempGDao.queryAllCurrOrgByPage(contTempGVo);
		logger.debug("当前查询本人所属机构数据信息的结果集数量为:"+contTempGs.size());
		List<ContTempGVO> list = null;
		try {
			pageSet(contTempGs, contTempGVo);
			list = (List<ContTempGVO>) beansCopy(contTempGs, ContTempGVO.class);
		} catch (Exception e) {
			logger.error("数据转换出现异常!", e);
		}
		
		return list;
	
	}


	/**
	 * 查询当前机构及下属机构权限数据
	 */
	@SuppressWarnings("unchecked")
	public List<ContTempGVO> queryAllCurrDownOrg(ContTempGVO contTempGVo) {

		logger.debug("当前查询本人所属机构及以下数据信息的参数信息为:");
		List<ContTempG> contTempGs = contTempGDao.queryAllCurrDownOrgByPage(contTempGVo);
		logger.debug("当前查询本人所属机构及以下数据信息的结果集数量为:"+ contTempGs.size());
		List<ContTempGVO> list = null;
		try {
			pageSet(contTempGs, contTempGVo);
			list = (List<ContTempGVO>) beansCopy(contTempGs, ContTempGVO.class);
		} catch (Exception e) {
			logger.error("数据转换出现异常!", e);
		}
		
		return list;
	
	}

	@Override
	public int insertContTempRelG(ContTempRelGVO contTempRelGVO) {
		logger.debug("当前新增数据为:"+ contTempRelGVO.toString());
		String contTempIdArr = contTempRelGVO.getContTempIdArr();
		int num = 0;
		try {
			String[] contTempIds = contTempIdArr.split(",");
			
			if ( null != contTempIds && contTempIds.length > 0 ) {
				ContTempGVO contTempGVO = new ContTempGVO();
				contTempGVO.setContGroupId(contTempRelGVO.getContGroupId());
				List<ContTempInfo> oldConTemps = contTempInfoDao.queryLinkedGontTempInfos(contTempGVO);
				List<ContTempInfo> newConTemps = contTempInfoDao.queryContTempInfosByPKs(Arrays.asList(contTempIds));
				
				List<ContTempInfo> alls = new ArrayList<>();
				if  ( null != oldConTemps && oldConTemps.size() > 0)
					alls.addAll(oldConTemps);
				if  ( null != newConTemps && newConTemps.size() > 0)
					alls.addAll(newConTemps);
				if (alls.size() == 0) 
					return 0;
				ContTempInfo cTemp;
				ContTempInfo cOtherTemp;
				//判断关联合同模版组的合同模版是否存在 模版种类, 合同类型, 是否最高额合同三种纬度相同的合同模板!
				for (int i = 0; i < alls.size(); i++) {
					cTemp = alls.get(i);
					for (int j = 0; j < alls.size(); j++) {
						cOtherTemp = alls.get(j);
						if (!isEquals(cTemp.getContTempId(), cOtherTemp.getContTempId()) ) {
							if ( isEquals(cTemp.getContTempType(), cOtherTemp.getContTempType())
								&& isEquals(cTemp.getContType(), cOtherTemp.getContType())	
								&& isEquals(cTemp.getMaxLmtContFlag(), cOtherTemp.getMaxLmtContFlag()) ) {
								return -3;
							}
							
						}
					}
				}
				
				ContTempRelGVO temp;
				int count;
				for (int i = 0; i < contTempIds.length; i++) {
					temp = new ContTempRelGVO();
					beanCopy(contTempRelGVO, temp);
					temp.setContTempId(contTempIds[i]);
					count = contTempGDao.qureyContTempRelGCountByPK(temp);
					if ( count == 0) {
						num += contTempGDao.insertContTempRelG(temp);
					}
				}
			}
		} catch (Exception e) {
			logger.error("新增数据发生异常!", e);
			num = -1;
		}
		logger.debug("当前新增数据条数为:"+ num);
		return num;
	}

	@Override
	public int deleteContTempRelG(ContTempRelGVO contTempRelGVO) {
		logger.debug("当前新增数据为:"+ contTempRelGVO.toString());
		int num = 0;
		try {
			num = contTempGDao.deleteContTempRelG(contTempRelGVO);
		} catch (Exception e) {
			logger.error("新增数据发生异常!", e);
			num = -1;
		}
		logger.debug("当前新增数据条数为:"+ num);
		return num;
	}

	@Override
	public int disableContTempG(ContTempGVO contTempGVo) {
		logger.debug("当前生效数据为:"+ contTempGVo.toString());
		int num = 0;
		try {
			PrdInfo prdInfo = new PrdInfo();
			prdInfo.setContTemplateId(contTempGVo.getContGroupId());
			List<PrdInfo> prdInfos = prdInfoDao.queryPrdInfoByOthers(prdInfo);
			ContTempG contTempG = new ContTempG();
			beanCopy(contTempGVo, contTempG);
			int total = prdInfos != null ? prdInfos.size() : 0;
			if ( total > 0)
				num = -2;
			else
				num = contTempGDao.disableContTempG(contTempG);
		} catch (Exception e) {
			logger.error("新增数据发生异常!", e);
			num = -1;
		}
		logger.debug("当前新增数据条数为:"+ num);
		return num;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ContTempGVO> queryAllEnables(ContTempGVO contTempGVo) {

		logger.debug("当前查询当前登录用户的 法人机构 下生效的合同模版组的参数信息为:");
		List<ContTempGVO> list = null;
		try {
			List<ContTempG> contTempGs = contTempGDao.queryAllEnablesByPage(contTempGVo);
			logger.debug("当前查询当前登录用户的 法人机构 下生效的合同模版组的结果集数量为:"+ contTempGs.size());
			pageSet(contTempGs, contTempGVo);
			list = (List<ContTempGVO>) beansCopy(contTempGs, ContTempGVO.class);
		} catch (Exception e) {
			logger.error("数据转换出现异常!", e);
		}
		
		return list;
	}

	@Override
	public ContTempGVO insertContTempGBack(ContTempGVO inContTempGVo) {
		logger.debug("当前新增数据为:"+ inContTempGVo.toString());
		ContTempGVO outputVo = null;
		int num = 0;
		try {
			ContTempG contTempG = new ContTempG();
			beanCopy(inContTempGVo, contTempG);
			String contGroupId = UUID.randomUUID().toString().replace("-", "");
			contTempG.setContGroupId(contGroupId);
			num = contTempGDao.insertContTempG(contTempG);
			if ( num > 0 ) {
				ContTempG temp = contTempGDao.queryByPk(contTempG);
				outputVo = new ContTempGVO();
				beanCopy(temp, outputVo);
			}
		} catch (Exception e) {
			logger.error("新增数据发生异常!", e);
			num = -1;
		}
		
		logger.debug("当前新增数据条数为:"+ num);
		return outputVo;
	}

	@Override
	public int updateSubmitByPk(ContTempGVO inContTempGVo) {
		logger.debug("当前修改数据为:"+ inContTempGVo.toString());
		int num = 0;
		try {
			num = contTempGDao.queryContTempRelCount(inContTempGVo.getContGroupId());
			if (num > 0) {
				ContTempG contTempG = new ContTempG();
				beanCopy(inContTempGVo, contTempG);
				num = contTempGDao.updateSubmitByPk(contTempG);
			}else if ( num == 0) //num == 0, 合同模版组未关联合同模版, 不可以生效
				num = -3;
			
		} catch (Exception e) {
			logger.error("修改数据发生异常!", e);
			num = -1;
		}
		logger.debug("根据条件:"+ inContTempGVo +"修改的数据条数为"+ num);
		return num;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<ContTempGVO> queryAllCurrLegalOrgByPage(ContTempGVO contTempGVo) {

		logger.debug("当前查询法人机构所属数据信息的参数信息为:");
		List<ContTempGVO> list = null;
		try {
			List<ContTempG> contTempGs = contTempGDao.queryAllCurrLegalOrgByPage(contTempGVo);
			logger.debug("当前查询本人所属数据信息的结果集数量为:"+ contTempGs.size());
			pageSet(contTempGs, contTempGVo);
			list = (List<ContTempGVO>) beansCopy(contTempGs, ContTempGVO.class);
		} catch (Exception e) {
			logger.error("数据转换出现异常!", e);
		}
		
		return list;
	
	}
	/**
	 * 判断两个字符串是否相等
	 * @param src
	 * @param target
	 * @return
	 */
	public static boolean isEquals(String src, String target) {
		if ( src == target) return true;
		boolean flag = false;
		if ( src != null )  {
			flag = src.equals(target);
		}
		return flag;
	}
}
